#include <stdio.h> 
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>

//Variable para contar el numero de veces que se recibe la señal SIGUSR1
int recibido=0;	
//Variable para verificar si se ha recibido una interrupcion SIGUSR1
int aviso=0; 
	
	//Cabeceras de las funciones que hacen de manejador de cada señal	
	void manSIGKILL(int sig);
	void manSIGUSR1(int sig);
	void manSIGINT(int sig);
	void manSIGUSR2(int sig);
	void manSIGTERM(int sig);

int main() {
	//Tiempo que duerme el proceso dentro del bucle while
	int t=1;
	struct sigaction sigact;
	
	// Establecer gestor para señal SIGXXX
	sigact.sa_handler = manSIGKILL;
	sigact.sa_flags = SA_RESTART;
	sigaction(SIGKILL, &sigact, 0);
	
	sigact.sa_handler = manSIGUSR1;
	sigact.sa_flags = SA_RESTART;
	sigaction(SIGUSR1, &sigact, 0);

	sigact.sa_handler = manSIGINT;
	sigact.sa_flags = SA_RESTART;
	sigaction(SIGINT, &sigact, 0);	

	sigact.sa_handler = manSIGUSR2;
	sigact.sa_flags = SA_RESTART;
	sigaction(SIGUSR2, &sigact, 0);

	sigact.sa_handler = manSIGTERM;
	sigact.sa_flags = SA_RESTART;
	sigaction(SIGTERM, &sigact, 0);

	while (1) {
	printf("PID: %d, PPID: %d Estoy durmiendo Zzzz\n",getpid(),getppid());	
	sleep(t);
	}
}

void manSIGKILL (int sig)
{
	sleep(2);
	printf("Fin\n");
	exit(0);
}

void manSIGUSR1(int sig)
{
	recibido++;
	printf("Esta señal se ha recibido %d veces \n",recibido);	
}

void manSIGINT(int sig) 
{
	if (aviso==0) {
			printf("\nEnvie una nueva señal SIGINT para finalizar el programa\n");
			aviso++;
			}
		else
		{ 
			printf("\nSegunda señal SIGINT recibida, el programa va a finalizar \n");			
			exit(0);
		}	
}

void manSIGUSR2(int sig)
{
	pid_t hijo=fork();
	if(hijo!=0)	
	printf("Se ha creado un proceso hijo con PID %d\n",hijo);	
}

void manSIGTERM(int sig)
{
	printf("Señal SIGTERM ignorada \n");
}
